/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logic;

import entidades.Disciplina;
import entidades.GrauDificuldade;
import entidades.Questao;
import entidades.TipoQuestao;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Luan
 */
public class Mixer {
    
    private static List<Questao> listaDiscursiva = new ArrayList<Questao>();
    private static List<Questao> listaMultEscolha = new ArrayList<Questao>();
    
    public static void pegaQuestoes(Disciplina disciplina, String listaTopico){
        List<Questao> listaQuestao = new ArrayList<Questao>();
        try {
            listaQuestao = disciplina.listarQuestao();
        } catch(Exception ex) {
            Logger.getLogger(Mixer.class.getName()).log(Level.SEVERE, null, ex);
        }
        String listaTopicoQuestao;
        
        for(Questao questao : listaQuestao){
            listaTopicoQuestao = questao.getTopico();
            if(verificaTopico(listaTopicoQuestao, listaTopico)){
                if(questao.getTipoQuestao().compareTo(TipoQuestao.DISCURSIVA) == 0)
                    listaDiscursiva.add(questao);
                else if(questao.getTipoQuestao().compareTo(TipoQuestao.MULTIPLA_ESCOLHA) == 0)
                    listaMultEscolha.add(questao);
            }
        }
    }
    
    public static boolean verificaTopico(String listaTopicoQuestao, String listaTopico){
        List <String> topicosExistentes = FuncoesQuestoesGUI.listarTopicos(listaTopicoQuestao);
        List <String> topicosProcurados = FuncoesQuestoesGUI.listarTopicos(listaTopico);
        String existente, procurado;
        for (int i = 0; i < topicosExistentes.size(); i++){
            existente = topicosExistentes.get(i);
            for(int j = 0; j < topicosProcurados.size(); j++){
                procurado = topicosProcurados.get(j);
                if(existente.equalsIgnoreCase(procurado)) return true;
                else continue;
            }
        }
        return false;
    }
    
    public static List<Questao> sortearQuestoes(Disciplina disc, String listaTopico, int qtdeDiscFacil, 
    int qtdeDiscMedia, int qtdeDiscDificil, int qtdeMEFacil, int qtdeMEMedia, 
    int qtdeMEDificil){
        
        List<Questao> listaSelecionadas = new ArrayList<Questao>();
        pegaQuestoes(disc, listaTopico);
        
        if(!listaDiscursiva.isEmpty()){
            Collections.shuffle(listaDiscursiva);
            for(Questao questaoDiscursiva : listaDiscursiva){
                if(qtdeDiscFacil == 0 && qtdeDiscMedia == 0 && qtdeDiscDificil == 0)
                    break;
                else if((questaoDiscursiva).getDificuldade().compareTo(GrauDificuldade.FACIL) == 0 && qtdeDiscFacil != 0){
                    listaSelecionadas.add(questaoDiscursiva);
                    qtdeDiscFacil--;
                }
                else if((questaoDiscursiva).getDificuldade().compareTo(GrauDificuldade.MEDIA) == 0 && qtdeDiscMedia != 0){
                    listaSelecionadas.add(questaoDiscursiva);
                    qtdeDiscMedia--;
                }
                else if((questaoDiscursiva).getDificuldade().compareTo(GrauDificuldade.DIFICIL) == 0 && qtdeDiscDificil != 0){
                    listaSelecionadas.add(questaoDiscursiva);
                    qtdeDiscDificil--;
                }
            }
        }
        
        if(!listaMultEscolha.isEmpty()){
            Collections.shuffle(listaMultEscolha);
            for(Questao questaoMultEscolha : listaMultEscolha){
                if(qtdeMEFacil == 0 && qtdeMEMedia == 0 && qtdeMEDificil == 0)
                    break;
                embaralhaOpcoes(questaoMultEscolha);
                if((questaoMultEscolha).getDificuldade().compareTo(GrauDificuldade.FACIL) == 0 && qtdeMEFacil != 0){
                    listaSelecionadas.add(questaoMultEscolha);
                    qtdeMEFacil--;
                }
                else if((questaoMultEscolha).getDificuldade().compareTo(GrauDificuldade.MEDIA) == 0 && qtdeMEMedia != 0){
                    listaSelecionadas.add(questaoMultEscolha);
                    qtdeMEMedia--;
                }
                else if((questaoMultEscolha).getDificuldade().compareTo(GrauDificuldade.DIFICIL) == 0 && qtdeMEDificil != 0){
                    listaSelecionadas.add(questaoMultEscolha);
                    qtdeMEDificil--;
                }
            }
        }
        return listaSelecionadas;
    }
    
    public static void embaralhaOpcoes(Questao questao){
        List<String> opcoes = new ArrayList();
        opcoes = questao.getOpcoes();
        Collections.shuffle(opcoes);
        questao.setOpcoes(opcoes);
    }
}